/*
sybon_ls_modbus.h
offer sybon_ls motor driver api,data type
designed by tianchunyu
(森创LS系列低压伺服驱动器驱动,机器人行走用)
-----------------------
2020-04-10 16:34:59
create file
-----------------------
*/
#ifndef _SYNRON_LS_MODBUS_H
#define _SYNRON_LS_MODBUS_H
#include"bsp.h"
#include<stdlib.h>
#include"string.h"
#include <math.h>
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#define LOG_SYNRON(format, args...) printf("[%s][%s][%d]: "format"\r\n",__FILENAME__,__func__,__LINE__,##args)

/*需提前设定以下两个地址为,以下两个地址为AGV小车地址 A 29 B 30  分别控制*/
#define SYNRON_A_MOTOR_SLAVEID  (29)     //出厂默认控制A相电机的modbus地址为1  程序默认为29 
#define SYNRON_B_MOTOR_SLAVEID  (30)     //出厂默认控制B相电机的modbus地址为2  程序默认为30

/*此两个地址为推缸的地址 驱动器A接前电缸 地址39  驱动器B接后电缸 地址40*/
#define SYNRON_A_MOTOR_LIFTER_SLAVEID  (39)     //出厂默认控制A相电机的modbus地址为1  程序默认为39 
#define SYNRON_B_MOTOR_LIFTER_SLAVEID  (40)     //出厂默认控制B相电机的modbus地址为2  程序默认为40


/*此两个地址为刷子和举平机构 其中驱动器A接举平，B接刷子旋转 50*/
#define SYNRON_BRUSH_HINGE_SLAVEID (49)     //出厂默认控制B相电机的modbus地址为2  程序默认为40
#define SYNRON_BRUSH_SLAVEID  (50)     //出厂默认控制A相电机的modbus地址为1  程序默认为39 



/*
The following is the register address space 

1.States region 
2.parameter region 
3.command region
total 3 kinds
*/
/*
1.States region 
*/
#define STATE_BASE_ADR                  (0x00)       //状态区基地址
#define STATE_MOTOR_SPEED               (STATE_BASE_ADR + 0x00)    //电机运行速度 rpm
#define STATE_POS_PULSE_FREQ_HZ         (STATE_BASE_ADR + 0x01)    //位置脉冲指定的频率 kHZ
#define STATE_MOTOR_VALID_TOR_RATE      (STATE_BASE_ADR + 0x02)    //电机有效转矩率（单位 1‰）
#define STATE_POS_STAY_PULSE_RATE       (STATE_BASE_ADR + 0x03)    //位置控制方式运行时的滞留脉冲数（单位 Pulse）
#define STATE_MOTOR_POS_ROTOR           (STATE_BASE_ADR + 0x04)    //显示电机单周内的转子位置（单位 Pulse）
#define STATE_SPEEDMODE_VOLTAGE_VAL     (STATE_BASE_ADR + 0x05)    //速度方式时，模拟速度指令电压值（单位 1mV）
#define STATE_TORQUE_VOLTAGE_VAL        (STATE_BASE_ADR + 0x06)    //转矩控制方式时，转矩指令电压值（单位 1mV）
#define STATE_MOTOR_SPEED_VAL           (STATE_BASE_ADR + 0x07)    //0x07 电机速度命令值（单位 rpm）
#define STATE_MOTOR_ABS_POS_LOW_ORD     (STATE_BASE_ADR + 0x1B)    //0x1B 总线模式下，电机绝对位置指令（单位：脉冲）32 位数据格式，偏移地址 27 为低 16 位数据，偏移地址 28 为高 16 位数据，与一般的 PLC 及28 0x1C HMI 保持一致。
#define STATE_MOTOR_ABS_POS_HIGH_ORD    (STATE_BASE_ADR + 0x1C)    //0x1B 总线模式下，电机绝对位置指令（单位：脉冲）32 位数据格式，偏移地址 27 为低 16 位数据，偏移地址 28 为高 16 位数据，与一般的 PLC 及28 0x1C HMI 保持一致。
#define STATE_MOTOR_ABS_POS_LOW_ACCVALUE    (STATE_BASE_ADR + 0x1D)    //29 0x1D 总线模式下，电机绝对位置累计（单位：脉冲）。 32 位数据格式，偏移地址 29 为低 16 位数据，偏移地址 30 为高 16 位数据，与一般的 PLC 及30 0x1E HMI 保持一致。
#define STATE_MOTOR_ABS_POS_HIGH_ACCVALUE   (STATE_BASE_ADR + 0x1E)    //30 0x1E 总线模式下，电机绝对位置累计（单位：脉冲）。 32 位数据格式，偏移地址 29 为低 16 位数据，偏移地址 30 为高 16 位数据，与一般的 PLC 及30 0x1E HMI 保持一致。
#define STATE_MOTOR_SIG_ROT_COM_VAL     (STATE_BASE_ADR + 0x1F)    //显示电机单周内的转子位置（单位 Pulse）的补值。该值与 Dn04 的和为电机旋转一圈的脉冲个数
#define STATE_MOTOR_FAULT_CODE          (STATE_BASE_ADR + 0x36)    //当前扫描的故障代码
#define STATE_MOTOR_SERIOUS_ERROR_CODE  (STATE_BASE_ADR + 0x38)    //严重错误代码
#define STATE_MOTOR_SERIOUS_WARNING_CODE (STATE_BASE_ADR + 0x39)    //警告故障代码
#define STATE_DIGITAL_PHYSICAL_INPUT     (STATE_BASE_ADR + 0x30)    //数字量物理输入


/*
2.some part of parameter region about speed mode
*/

#define PARAMETER_BASE_ADR              (0x2710)  //参数区基地址   十进制10000
#define PARAMETER_MODE_WORK             (PARAMETER_BASE_ADR + 0x0000)//1：普通模式； 2： Modbus 总线模式； 3： CAN 总线模式
#define PARAMETER_MODE_CONTROL          (PARAMETER_BASE_ADR + 0x0001)//0：外部速度运行方式； 1：内部速度模式； 2：外部脉冲位置模式；3:JOG 点动运行模式； 4：转矩运行控制模式； 5~10：混合控制模式。 电机控制模式
#define PARAMETER_MODE_M_C_CONTROL      (PARAMETER_BASE_ADR + 0x0003)//0：待机模式； 1：转矩运行； 2：速度运行； 3：增量位置运行； 4:绝对位置运行  Modbus/CAN 总线控制模式下
#define PARAMETER_ROTA_DIRECTION        (PARAMETER_BASE_ADR + 0x0004)//电机旋转方向定义 0 逆时针正转 1顺时针正转


#define PARAMETER_CLEAR_ALM             (PARAMETER_BASE_ADR + 0x0011)//报警清除 1 有效 0无效
#define PARAMETER_STOP_EMG              (PARAMETER_BASE_ADR + 0x0012)//1：内部无效；0：内部有效由 CN2 数字输入信号端口 IN1~4 决定。急停信号低电平有效，用于紧急停止，此时电机绕组迅速断电
#define PARAMETER_OUPUT_1_SET           (PARAMETER_BASE_ADR + 0x0030)//数字输出 1（OUT1）设置
#define PARAMETER_OUPUT_2_SET           (PARAMETER_BASE_ADR + 0x0031)//数字输出 2（OUT2）设置

#define PARAMETER_INSEL0                (PARAMETER_BASE_ADR + 0x0014)//1：内部有效； 0：内部无效； 内部速度模式时，切换内部速度 INSPD0；
#define PARAMETER_INSEL1                (PARAMETER_BASE_ADR + 0x0015)//1：内部有效； 0：内部无效； 内部速度模式时，切换内部速度 INSPD0；
#define PARAMETER_INSEL2                (PARAMETER_BASE_ADR + 0x0016)//1：内部有效； 0：内部无效； 内部速度模式时，切换内部速度 INSPD0；


#define PARAMETER_SERVO_ENABLE          (PARAMETER_BASE_ADR + 0x0010)   //在 MODBUS 访问中，写 1 使能 0 关 -1 ~ -4：由 CN2 数字输入信号端口 IN1~4 决定
#define PARAMETER_MODE_COMMU            (PARAMETER_BASE_ADR + 0x00F0)  //0 :RS232 1:RS485   实际没有232
#define PARAMETER_MOD_BAUD_RATE         (PARAMETER_BASE_ADR + 0x00F1)   //总线波特率单位：100bps 默认96         即  9600
#define PARAMETER_NUM_NODE              (PARAMETER_BASE_ADR + 0x00F2)   //总线节点号 1-255    出厂默认     1  和2  通过这个修改地址  一个 驱动器里面两个485地址
#define PARAMETER_NUM_JOG_SPEED         (PARAMETER_BASE_ADR + 0x0070)   //jog速度设定值 -500~500       100默认    rpm
#define PARAMETER_SPEED_INT_1           (PARAMETER_BASE_ADR + 0x0071)   //内部速度1设定值        -30000～+30000 rpm   出厂设定500 
#define PARAMETER_SPEED_INT_2           (PARAMETER_BASE_ADR + 0x0072)   //内部速度1设定值        -30000～+30000 rpm   出厂设定1000 
#define PARAMETER_SPEED_INT_3           (PARAMETER_BASE_ADR + 0x0073)   //内部速度1设定值        -30000～+30000 rpm   出厂设定1500 
#define PARAMETER_SPEED_INT_4           (PARAMETER_BASE_ADR + 0x0074)   //内部速度1设定值        -30000～+30000 rpm   出厂设定2000 
#define PARAMETER_SPEED_INT_5           (PARAMETER_BASE_ADR + 0x0075)   //内部速度1设定值        -30000～+30000 rpm   出厂设定-2000 
#define PARAMETER_SPEED_INT_6           (PARAMETER_BASE_ADR + 0x0076)   //内部速度1设定值        -30000～+30000 rpm   出厂设定-1500 
#define PARAMETER_SPEED_INT_7           (PARAMETER_BASE_ADR + 0x0077)   //内部速度1设定值        -30000～+30000 rpm   出厂设定-1000 
#define PARAMETER_SPEED_INT_8           (PARAMETER_BASE_ADR + 0x0078)   //内部速度1设定值        -30000～+30000 rpm   出厂设定-500 
#define PARAMETER_MOMENT_FAC            (PARAMETER_BASE_ADR + 0x0084)   //负载转动惯量系数 100-1000 1%
#define PARAMETER_SPEED_CON_KV1         (PARAMETER_BASE_ADR + 0x0087)   //速度环比例增益Kv1
#define PARAMETER_SPEED_CON_TI_1        (PARAMETER_BASE_ADR + 0x0088)   //速度环第 1 积分时间常数 Ti           1~10000 0.1ms
#define PARAMETER_SPEED_CON_KV2         (PARAMETER_BASE_ADR + 0x0089)   //速度环比例增益Kv2
#define PARAMETER_SPEED_CON_TI_2        (PARAMETER_BASE_ADR + 0x008A)   //速度环第 2 积分时间常数 Ti           1~10000 0.1ms 
/*locate mode register*/
#define PARAMETER_PULSE_CLR             (PARAMETER_BASE_ADR + 0x001c)   //1：内部有效 0 内部无效 清除驱动器脉冲指令误差
#define PARAMETER_ROTA_CCWL             (PARAMETER_BASE_ADR + 0x001E)   //正转禁止设置 1 内部有效 0内部无效
#define PARAMETER_ROTA_CWL              (PARAMETER_BASE_ADR + 0x001F)   //反转禁止设置 1内部有效 0内部无效  
#define PARAMETER_PULSE_BIAS_ENB_CLR    (PARAMETER_BASE_ADR + 0x002c)   //位置滞留脉冲偏差清除 伺服使能（ SON）无效时是否清除位置滞留脉冲偏差： 0：清除； 1：不清除
#define PARAMETER_AB_ENCODER            (PARAMETER_BASE_ADR + 0x003E)   //编码器 A/B 脉冲输出分频数
#define PARAMETER_Z_PULSE_WIDTH         (PARAMETER_BASE_ADR + 0x003F)   //编码器Z脉冲输出宽度
#define PARAMETER_GEAR_PERCEN_1         (PARAMETER_BASE_ADR + 0x0050)   //电子齿轮比分子1
#define PARAMETER_GEAR_PERCEN_2         (PARAMETER_BASE_ADR + 0x0051)   //电子齿轮比分子2
#define PARAMETER_GEAR_PERCEN_3         (PARAMETER_BASE_ADR + 0x0052)   //电子齿轮比分子3
#define PARAMETER_GEAR_PERCEN_4         (PARAMETER_BASE_ADR + 0x0053)   //电子齿轮比分子4
#define PARAMETER_GEAR_PERCEN_M         (PARAMETER_BASE_ADR + 0x0054)   //电子齿轮比分母
#define PARAMETER_PULSE_INPUT_VEC       (PARAMETER_BASE_ADR + 0x0056)   //脉冲输入指令指数滤波比例系数       滤波后位置脉冲个数不变。取值越大，加减速时间越长，动态响应性越差
#define PARAMETER_PULSE_FILTER          (PARAMETER_BASE_ADR + 0x0057)   //脉冲输入指令移动平滑滤波
#define PARAMETER_POSLOOP_VEC           (PARAMETER_BASE_ADR + 0x005A)   //位置环速度前反馈系数
#define PARAMETER_POSLOOP_LOW_FIL_VEC   (PARAMETER_BASE_ADR + 0x005B)   //位置环速度前馈低通滤波器时间常数  0~6400 0.01ms
#define PARAMETER_POSLOOP_KP1           (PARAMETER_BASE_ADR + 0x005C)   //位置环第一比例系数。1~10000 0.01 取值越大，位置环响应越快，但可能出现超调或者振荡
#define PARAMETER_POSLOOP_KP2           (PARAMETER_BASE_ADR + 0x005D)   //位置环第二比例系数。1~10000 0.01 取值越大，位置环响应越快，但可能出现超调或者振荡

#define PARAMETER_MAX_SPEED             (PARAMETER_BASE_ADR + 0x00AC)   //1~30000 rpm   位置和速度模式下，最大允许速度指令；转矩模式下，最大转速限制值
#define PARAMETER_TIME_ACCELERATE       (PARAMETER_BASE_ADR + 0x00B8)   //电机加速时间设置 ms 100默认
#define PARAMETER_TIME_DECELERATION     (PARAMETER_BASE_ADR + 0x00B9)   //电机减速时间设置 ms 100默认
#define PARAMETER_BREAK_CONTROL         (PARAMETER_BASE_ADR + 0x0037)   //-2：上电抱闸自动打开；-1：伺服自动控制；0：强制关闭抱闸；1：强制打开抱闸
#define PARAMETER_TIME_BREAK_REL        (PARAMETER_BASE_ADR + 0x00C0)   //电磁制动器释放动作时间
#define PARAMETER_BREAK_WAIT_SPEED      (PARAMETER_BASE_ADR + 0x00C1)   //低于此转速才可以启动电磁制动；只需满足 Fn 0C1 与 Fn 0C2 条件之一即可启动制动
#define PARAMETER_BREAK_WAIT_TIME       (PARAMETER_BASE_ADR + 0x00C2)   //大于等待时间才可以电磁制动，否则自由停车；
#define PARAMETER_BREAK_CHG_SPEED       (PARAMETER_BASE_ADR + 0x00C3)   //电机速度绝对值小于 Fn0C3 时，认为电机处于低速运行，此时电磁制动器可直接制动
#define PARAMETER_BREAK_TIME            (PARAMETER_BASE_ADR + 0x00C4)   //电磁制动器制动动作时间 从发出制动指令到制动器完全制动的时间，由制动器线圈的电气参数决定
#define PARAMETER_OVER_VOLTAGE_PROT     (PARAMETER_BASE_ADR + 0x00D0)   //当直流母线电压超过Fn0D0 发生 E_oUdc 过压报警 0~10000 0.1V 100
#define PARAMETER_BELOW_VOLTAGE_PROT    (PARAMETER_BASE_ADR + 0x00D1)   //欠压报警电压设定值   0~1200 0.1V
#define PARAMETER_BELOW_VOLTAGE_MODE    (PARAMETER_BASE_ADR + 0x00D2)   //欠压报警模式 0：不允许报警，继续运行； 1：允许报警； 2：不允许报警，但停机并等待功率电正常
#define PARAMETER_POS_BIAS_SETVALUE     (PARAMETER_BASE_ADR + 0x00DA)   //位置超差的偏差设定值 |滞留脉冲数| ≥ Fn 0DA 时，发生 E PoSE 位置超差警告； Fn0DA=0 时，超差警告无效
#define PARAMETER_OVERSPEED_ALARM_NUM   (PARAMETER_BASE_ADR + 0x00DF)   //电机超速报警设定门限值 电机超速报警设定门限值
#define PARAMETER_OVERLOAD_ENBLE        (PARAMETER_BASE_ADR + 0x00E2)   //过载报警使能 0：过载保护（限制为额定转矩输出）但不报警； 1：过载则报警停机
#define PARAMETER_TIME_COMMU_BUS        (PARAMETER_BASE_ADR + 0x00E3)   //总线通讯检测时间 0：不进行总线检测和报警；大于 0 表示总线通讯报警时间，超过此时间报警 E_coUt
#define PARAMETER_ENBA_FILTER_ALARM     (PARAMETER_BASE_ADR + 0x00E5)   //在电磁噪音干扰地区，越大可减少 E_EnAb 报警，推荐 1000~2000，取负数则取消报警
#define PARAMETER_TEMP_CHECK            (PARAMETER_BASE_ADR + 0x00E7)   //控制板温度检测 0：关闭过温检测； ≥1：过温报警门限值
#define PARAMETER_QEPENCODER_SAM_PERI   (PARAMETER_BASE_ADR + 0x0135)   //QEP 编码器采样滤波周期 0~199 — 4 重新上电
#define PARAMETER_CURRENT_LOOP_KP       (PARAMETER_BASE_ADR + 0x0151)   //电流环比例增益 比例增益越大，电机刚性加强，过大可能会造成电机运行噪音加大
#define PARAMETER_CURRENT_LOOP_TI       (PARAMETER_BASE_ADR + 0x0152)   //积分时间常数减小，电机刚性加强，过大可能会造成电机运行噪音加大




/*
3.1.General command register
*/
#define COMMAND_GEN_BASE_ADR            (0x4E20)    //一般命令寄存器基地址 20000
#define COMMAND_NUM_SET_SPEED           (COMMAND_GEN_BASE_ADR + 0x00) //MODBUS 速度模式下，速度指令。 单位： RPM
#define COMMAND_NUM_SET_TORQUE          (COMMAND_GEN_BASE_ADR + 0x01) //转矩模式下，转矩指令。 单位： 额定转矩的千分之
/*
MODBUS 位置模式下，电机绝对位置指令 当前强置期望值。 单位：脉冲。
32 位数据格式，偏移地址 2 为低 16 位数据，偏移地址 3 为高 16 位数据，与一般的 PLC 及
3 HMI 保持一致。
*/
#define COMMAND_NUM_SET_LOW_POS         (COMMAND_GEN_BASE_ADR + 0x02)
#define COMMAND_NUM_SET_HIGH_POS        (COMMAND_GEN_BASE_ADR + 0x03)
/*
32 位数据格式，偏移地址 4 为低 16 位数据，偏移地址 5 为高 16 位数据，与一般的 PLC 及
5 HMI 保持一致 举例说明：通过访问地址 20000 来访问 MODBUS 速度指令；通过 32 位方式访问地址 20004
和 20005 来对当前电机累计位置进行重新初始设置，设置的结果在状态空间偏移地址 29,30 中有
反馈，该反馈值可通过访问地址 29,30 来读取
*/
#define COMMAND_NUM_SET_LOW_COORDINATE  (COMMAND_GEN_BASE_ADR + 0x04)   //
#define COMMAND_NUM_SET_HIGH_COORDINATE (COMMAND_GEN_BASE_ADR + 0x05)   //
/*
总线位置模式下，电机位置指令时间统计值 当前强制初始值。单位： ms。
回归零点确认码。为 0x55aa 时，确认按设定归零模式执行回归零点操作 statistical 
*/
#define COMMAND_NUM_SET_LOW_TIME_STATIS     (COMMAND_GEN_BASE_ADR + 0x06)
#define COMMAND_NUM_SET_HIGH_TIME_STATIS    (COMMAND_GEN_BASE_ADR + 0x07)
#define COMMAND_BACK_ZEROPOINT          (COMMAND_GEN_BASE_ADR + 0x08)

/*
3.2.Special command register
*/
#define COMMAND_SPE_BASE_ADR            (0x55F0)    //特殊命令寄存器基地址 22000
#define COMMAND_TIME_DISTANCE_ONCE      (COMMAND_SPE_BASE_ADR + 0x00)   //MODBUS 位置模式下，一次位移的时间。 单位： ms
/*
特殊命令区的位置指令的含义与参数 Fn 003 的设置值有关，当 Fn 003 的值为 3 时，表示增
量位置指令，一次位置的 32 位指令表示在当前位置上再移动的当量；当 Fn 003 的值为 4 时，表
示绝对位置指令，一次位置的 32 位指令表示移动到该位置。
举例说明：在当 Fn 003 的值为 4 时，表示绝对位置指令模式
通过访问地址 22000 来访问当前一次移动的时间，通过 32 位方式访问地址 22001 和 22002
来设置一次移动的目标绝对位置
*/
#define COMMAND_SPE_NUM_SET_LOW_POS     (COMMAND_SPE_BASE_ADR + 0x01)
#define COMMAND_SPE_NUM_SET_HIGH_POS    (COMMAND_SPE_BASE_ADR + 0x02)

/*define  error code */
#define READADD_16_ERR (0x8000)   //-32768  16位读取数据错误
#define READADD_32_ERR (0x80000000)         //32位读取数据错误
#define SYNRON_COMMUN_ERR  (-1)
#define SYNRON_SUCCESS (0)  
#define SYNRON_NOR_ERR (-2)
/************************************************************************************/



/*********************data type define*********************/

typedef enum{
    value96 = 96,     //9600bps   单位为100bps
    value1152 = 1152   //115200    max 最大支持    
}SYNRON_MODEBUS_BA_RATE;

typedef enum{
    syn_off=0, //关闭状态
    syn_on,    //打开状态
    syn_error  //error
}SYNRON_TYPE;

typedef enum{
    syn_torque = 1,     //转矩模式
    syn_speed,    //内部速度模式
    syn_pos_rela_time, //增量式位置模式时间运行模式
    syn_pos_abs_time,    //位置模式绝对位置模式
    syn_pos_rela_speed,  //增量式位置协议速度模式
    syn_pos_abs_speed    //绝对位置协议速度模式
}SYNRON_DRIVE_MODE;



typedef struct{
    u8  direct;      //电机当前的运动方向  1. 规定向前为正(default)  2. 向后为负
    u8  torquerate;  //电机当前有效转矩率
    u8  drivemode;   //SYNRON_DRIVE_MODE 内部控制模式
    u8  res0;        //保留
    u16 acc_time;   //电机加速时间    modbus标准版本支持
    u16 dcc_time;   //电机减速时间
}SYNRON_CONFIG;
    

//motor state
typedef struct{
    u8 seria;     //电机序号 1为A相 2为B相
    u8 init;    //motor init state,1=init,0=uninit
    // MB_data modbus; //modbus data
    u8 en;  //motor enable state    SYNRON_TYPE 
    u8 res0; //
    u8 rec_data[10];    //modbus recive buffer
    u8 rec_len; //modbus recive data length
    u8 port;    //modbus uart port
    u32 speed;   //modbus uart speed
    int motor_speed;
    s32 encode_pulse;//encoder value
    u8 slave_id;    //modbus slave id
    u8 res[3];       //保留
    SYNRON_CONFIG config; //motor config}
}SYNRO_handler;





/********************function extern***********************/
extern SYNRO_handler synro_handler_A ;  //A电机为左B电机为右  都为小车行走电机
extern SYNRO_handler synro_handler_B ;
extern SYNRO_handler synro_lifter_handler_A;//A电机为左B电机为右  都为电缸推杆电机
extern SYNRO_handler synro_lifter_handler_B;  
extern SYNRO_handler synro_brush_handler;   //电机为刷子电机
extern SYNRO_handler synro_brush_hinge_hander; //为控制刷子电机与水平角度的电机extern void test_synron();



extern int synron_write_register(const SYNRO_handler *handler,u16 addr,u16 val);
extern int synron_read_coil(SYNRO_handler *handler,u16 addr);
extern s16 synron_read_hold(SYNRO_handler *handler,u16 addr);
extern int synron_read_reginster(const SYNRO_handler *handler,u16 addr,u16 read_len,u8 *rec_data,u8 *rec_len);
extern int synron_en(SYNRO_handler *handler,SYNRON_TYPE en);
extern int synron_mode_commset(SYNRO_handler *handler,u16 en);
extern int synron_mode_driveset(SYNRO_handler *handler,u8 en);
extern int synron_setemg_pinnum(SYNRO_handler *handler,s8 pinnum);
extern int synron_speedmode_setvalue(SYNRO_handler *handler,s16 value);
extern int synron_speedmode_motorstop(SYNRO_handler *handler);
extern int synron_speedmode_motor_acc(SYNRO_handler *handler,u16 acc,s16 destr );
extern int synron_speedmode_motor_dec(SYNRO_handler *handler,u16 acc,s16 destr );
extern int synron_speedmode_motor_slow_stop(SYNRO_handler *handler,u16 acc);
extern int synron_speedmode_acceleratetime(SYNRO_handler *handler,u16 value);
extern int synron_speedmode_deceleratetime(SYNRO_handler *handler,u16 value);
extern int synron_speedloop_load_rotational(SYNRO_handler *handler,u16 value);
extern int synron_speedloop_adjustKv1(SYNRO_handler *handler,u16 value);
extern int synron_speedloop_adjustTi1(SYNRO_handler *handler,u16 value);
extern int synron_speedloop_adjustKv2(SYNRO_handler *handler,u16 value);
extern int synron_speedloop_adjustTi2(SYNRO_handler *handler,u16 value);
extern int synron_get_speedvalue(SYNRO_handler *handler);
extern int synron_get_validtor_rate_value(SYNRO_handler *handler);
extern int synron_get_abs_pulsevalue(SYNRO_handler *handler);
extern int synron_get_curfault_code(SYNRO_handler *handler);
extern int synron_get_curserious_waring_code(SYNRO_handler *handler);
extern int synron_get_curserious_error_code(SYNRO_handler *handler);
extern int synron_position_setvalue(SYNRO_handler *handler,int value,u16 time);
extern int synron_position_re_encode_setvalue(SYNRO_handler *handler,s32 encode_vaule);
extern int synron_position_re_locacmd_setvalue(SYNRO_handler *handler,s32 encode_vaule);
extern int synron_posloop_setfeedbackrate(SYNRO_handler *handler,u8 value);
extern int synron_posloop_setfeedback_filtime(SYNRO_handler *handler,u16 value);
extern int synron_posloop_Kp1(SYNRO_handler *handler,u16 value);
extern int synron_posloop_Kp2(SYNRO_handler *handler,u16 value);
extern int synron_set_default_rotation(SYNRO_handler *handler,u8 value);
extern int synron_hander_init(SYNRO_handler * hander,u8 serial,u8 slave_id,u8 port,u32 speed);
extern void synron_cli_init(void);
extern int  xp_synron_speed_init(SYNRO_handler * hander);
extern int  xp_synron_position_init(SYNRO_handler * hander,u8 mode);
extern int  xp_synron_init(u8 mode,u8 port,u32 speed);

#endif
//end of the file
/*
synron cli help:

synron+(A or B or S)+X+Y
A:  A motor
B:  B motor
X:  command code
Y:  value which need to be set 
command example:
    
synron A I 2    将A电机初始化为2 速度模式
synron A I 3    将A电机初始化为3 增量位置模式
synron A I 4    将A电机初始化为4 绝对位置模式



synron A s 500 设置A 电机500rpm  正转
synron A s -500 设置A 电机-500rpm 相反方向

synron A e 1 设置A电机使能
synron A e 0 设置A电机不使能

synron A c 2 设置A电机为速度模式
synron A c 4 设置A电机为绝对位置模式
synron A 0 100  设置A电机以100加速度减速停下来
synron A + 100 200  设置A电机以100加速加速到200
synron A - 100 200  设置A电机以100加速度减速到200


(0: standby mode; 1: torque operation; 2: speed operation; 
3: incremental position operation; 4: absolute position operation)

synron A p 10000 500 设置A电机为10000脉冲 时间为500ms 绝对位置和相对位置会自己判断  数字正为正转

synron A r 读取当前的信息转速 绝对位置脉冲
synron A r 读取当前的信息转速 绝对位置脉冲

synron S i 2  2 115200  速度模式 端口2 进行初始化 115200波特率 同时AB
synron S s 200   同时让A B两个转 前提是分别设置为速度模式
synron S p 10000 500  位置模式下 同时让A B两个电机10000脉冲(1圈) 需要500ms
synron S r  同时读取 A B的两个电机位置模式和速度模式的信息

synron B 0 100      让B电机以100 减速慢慢停下来
synron A 0 100




*/
